# -*- coding: utf-8 -*-
"""
干旱指数计算基础模块

此模块提供干旱指数计算的基础类和通用方法。
定义了所有干旱指数计算器必须实现的接口。
"""

import os
import numpy as np
import pandas as pd
from abc import ABC, abstractmethod
from datetime import datetime

from dry_wet_abrupt.utils.cache import cache_data, load_cached_data
from dry_wet_abrupt.utils.export import export_to_excel
from dry_wet_abrupt.config import OUTPUT_DIR


class DroughtIndex(ABC):
    """
    干旱指数计算的抽象基类
    定义了所有干旱指数计算器必须实现的接口
    """
    
    def __init__(self, start_year=1960, end_year=2024, use_cache=True):
        """
        初始化干旱指数计算器
        
        参数:
            start_year (int): 起始年份
            end_year (int): 结束年份
            use_cache (bool): 是否使用缓存
        """
        self.start_year = start_year
        self.end_year = end_year
        self.use_cache = use_cache
    
    # @abstractmethod
    # def calculate_spa(self, provinces=None):
    #     """
    #     计算标准化降水异常值 (SPA)
    #
    #     参数:
    #         provinces (list): 省份列表，如为None则计算所有省份
    #
    #     返回:
    #         计算结果
    #     """
    #     pass
    #
    # @abstractmethod
    # def calculate_dwaai(self, provinces=None):
    #     """
    #     计算短周期旱涝急转指数 (DWAAI)
    #
    #     参数:
    #         provinces (list): 省份列表，如为None则计算所有省份
    #
    #     返回:
    #         计算结果
    #     """
    #     pass
    
    @abstractmethod
    def calculate_ldfai(self, provinces=None):
        """
        计算长周期旱涝急转指数 (LDFAI)
        
        参数:
            provinces (list): 省份列表，如为None则计算所有省份
            
        返回:
            计算结果
        """
        pass
    
    def save_result(self, result, output_file=None, index_name='LDFAI'):
        """
        保存计算结果
        
        参数:
            result: 计算结果
            output_file (str): 输出文件路径，如为None则自动生成
            index_name (str): 指数名称
        
        返回:
            str: 保存的文件路径
        """
        if output_file is None:
            # 生成默认文件名
            timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
            output_file = os.path.join(
                OUTPUT_DIR, 
                f"{self.__class__.__name__}_{index_name}_{self.start_year}-{self.end_year}_{timestamp}.xlsx"
            )
        
        return export_to_excel(result, output_file)
    
    def _standardize_precipitation(self, data):
        """
        标准化降水量
        
        参数:
            data (numpy.ndarray): 降水量数据
            
        返回:
            numpy.ndarray: 标准化后的降水量数据
        """
        mean = np.mean(data)
        std = np.std(data)
        if std == 0:
            return np.zeros_like(data)
        return (data - mean) / std